#include "list.h"

void vListInitialiseItem(ListItem_t * const pxItem)
{
	pxItem->pvContainer=NULL;
}

void vListInitialise(List_t* const pxList)
{
	// 将链表索引指针指向最后一个节点
	pxList->pxIndex=(ListItem_t*)&(pxList->xListEnd);

	// 将链表最后一个节点的辅助排序值设为最大，确保该节点是链表的最后一个节点
	pxList->xListEnd.xItemValue = portMAX_DELAY;

	// 将最后一个节点的pxNext和pxPrevious指针均指向节点自身，表示链表为空
	pxList->xListEnd.pxNext = (ListItem_t *)&(pxList->xListEnd);
	pxList->xListEnd.pxPrevious = (ListItem_t *)&(pxList->xListEnd);

	// 初始化链表节点计数器的值为0，表示链表为空
	pxList->uxNumberOfItem = (UBaseType_t)0U;
}

// 将节点插入到链表的末尾
void vListInsertEnd(List_t * const pxList, ListItem_t * const pxNewListItem)
{
	ListItem_t * const pxIndex = pxList->pxIndex;

	pxNewListItem->pxNext = pxIndex;
	pxNewListItem->pxPrevious = pxIndex->pxPrevious;
	pxIndex->pxPrevious->pxNext = pxNewListItem;
	pxIndex->pxPrevious = pxNewListItem;

	// 记住该节点所在的链表
	pxNewListItem->pvContainer = (void *)pxList;

	// 链表节点计数器加1
	(pxList->uxNumberOfItem)++;	
}

// 将节点按照升序插入到链表中
void vListInsert(List_t * const pxList, ListItem_t * const pxNewListItem)
{
	ListItem_t *pxIterator;

	// 获取节点的排序辅助值
	const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
	// 寻找节点要插入的位置
	if (xValueOfInsertion == portMAX_DELAY){
		pxIterator = pxList->xListEnd.pxPrevious;
	}else{
		for (pxIterator = (ListItem_t *)&(pxList->xListEnd); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext){
			// 空操作
		}
	}
	// 将节点插入到链表中
	pxNewListItem->pxNext = pxIterator->pxNext;
	pxNewListItem->pxNext->pxPrevious = pxNewListItem;
	pxNewListItem->pxPrevious = pxIterator;
	pxIterator->pxNext = pxNewListItem;
	// 记住该节点所在的链表
	pxNewListItem->pvContainer = (void *)pxList;

	// 链表节点计数器加1
	(pxList->uxNumberOfItem)++;
}
// 将节点从链表中删除
UBaseType_t uxListRemove(ListItem_t * const pxItemToRemove)
{
	// 获取节点所在的链表
	List_t * const pxList = (List_t *)pxItemToRemove->pvContainer;
	// 将节点从链表中删除
	pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
	pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
	// 调整链表节点索引指针
	if (pxList->pxIndex == pxItemToRemove){
		pxList->pxIndex = pxItemToRemove->pxPrevious;
	}
	// 初始化节点所在的链表为空
	pxItemToRemove->pvContainer = NULL;
	// 链表节点计数器减1
	(pxList->uxNumberOfItem)--;
	// 返回链表节点计数器的值
	return pxList->uxNumberOfItem;
}